﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;

using SMA.GENTEv1.Dados;

namespace SMA.GENTEv1
{
    public class Calendario
    {
        #region Variaveis Membro
        private DateTime _dataCompleta;
        private int _dia;
        private int _mes;
        private int _ano;
        private int _diadaSemana;
        private string _feriado;
        private int _bimestre;
        private int _trimestre;
        private int _semestre;
        private int _diaUtil;
        private int _semana;
        private int _quinzena;
        private GENTEEntities _context;
        #endregion

        #region Parametros
        public DateTime DataCompleta
        {
            get { return _dataCompleta; }
            set { _dataCompleta = value; }
        }

        public int Dia
        {
            get { return _dia; }
            set { _dia = value; }
        }

        public int Mes
        {
            get { return _mes; }
            set { _mes = value; }
        }

        public int Ano
        {
            get { return _ano; }
            set { _ano = value; }
        }

        public int DiadaSemana
        {
            get { return _diadaSemana; }
            set { _diadaSemana = value; }
        }

        public string Feriado
        {
            get { return _feriado; }
            set { _feriado = value; }
        }

        public int Bimestre
        {
            get { return _bimestre; }
            set { _bimestre = value; }
        }

        public int Trimestre
        {
            get { return _trimestre; }
            set { _trimestre = value; }
        }

        public int Semestre
        {
            get { return _semestre; }
            set { _semestre = value; }
        }

        public int DiaUtil
        {
            get { return _diaUtil; }
            set { _diaUtil = value; }
        }

        public int Semana
        {
            get { return _semana; }
            set { _semana = value; }
        }

        public int Quinzena
        {
            get { return _quinzena; }
            set { _quinzena = value; }
        }
        #endregion

        #region Construtores
        public Calendario()
        {
            try
            {
                _context = new GENTEEntities();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Métodos Privados

        #region Métodos Gerais
        private void EstruturaComboSemana(ref DataTable tabela)
        {
            DataColumn dataCompleta = new DataColumn();
            dataCompleta.ColumnName = "DataCompleta";
            dataCompleta.DataType = Type.GetType("System.DateTime");
            tabela.Columns.Add(dataCompleta);

            DataColumn semana = new DataColumn();
            semana.ColumnName = "Semana";
            semana.DataType = Type.GetType("System.String");
            tabela.Columns.Add(semana);
        }
        #endregion

        #region Métodos de Seleção
        private List<Calendario> BuscarDiasSemana(int ano, int semana)
        {
            try
            {
                List<Calendario> listCalendario = new List<Calendario>();

                var consulta = (from calendario in _context.tab_calendario
                                where calendario.semana == semana
                                && calendario.ano == ano
                                orderby calendario.data_completa
                                select new
                                {
                                    calendario.data_completa,
                                    calendario.dia,
                                    calendario.mes,
                                    calendario.ano,
                                    calendario.diadasemana,
                                    calendario.feriado,
                                    calendario.Bimestre,
                                    calendario.Trimestre,
                                    calendario.Semestre,
                                    calendario.dia_util,
                                    calendario.semana,
                                    calendario.quinzena
                                });

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    Calendario calendario = new Calendario();
                    calendario.DataCompleta = list.data_completa;
                    calendario.Dia = list.dia;
                    calendario.Mes = list.mes;
                    calendario.Ano = list.ano;
                    calendario.DiadaSemana = list.diadasemana;
                    calendario.Feriado = list.feriado;
                    calendario.Bimestre = list.Bimestre;
                    calendario.Trimestre = list.Trimestre;
                    calendario.Semestre = list.Semestre;
                    calendario.DiaUtil = (list.dia_util == null) ? 0 : int.Parse(list.dia_util.ToString());
                    calendario.Semana = (list.semana == null) ? 0 : int.Parse(list.semana.ToString());
                    calendario.Quinzena = (list.quinzena == null) ? 0 : int.Parse(list.quinzena.ToString());

                    listCalendario.Add(calendario);
                }

                return listCalendario;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #endregion

        #region Métodos Públicos

        #region Métodos de Seleção
        public List<Calendario> BuscarSemana(DateTime dataMes)
        {
            try
            {
                List<Calendario> listCalendario = new List<Calendario>();

                var consulta = (from calendario in _context.tab_calendario
                                where calendario.data_completa == dataMes
                                select new
                                {
                                    calendario.semana
                                });

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    int semana = (list.semana == null) ? 0 : int.Parse(list.semana.ToString());
                    listCalendario = BuscarDiasSemana(dataMes.Year, semana);
                    break;
                }

                return listCalendario;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public DataTable BuscarSemana(int ano, string dataMes)
        {
            try
            {
                DataTable resultado = new DataTable();

                var consulta = (from calendario in _context.tab_calendario
                                where calendario.ano == ano
                                orderby calendario.semana, calendario.data_completa
                                select new
                                {
                                    calendario.data_completa,
                                    calendario.semana
                                });

                var listConsulta = consulta.ToList();

                DataRow registro;
                int semana = 0;
                DateTime dataCompleta;
                foreach (var list in listConsulta)
                {
                    dataCompleta = list.data_completa;
                    if (dataCompleta.ToString("dd/MM/yyyy").Contains(dataMes))
                    {
                        if (semana != list.semana)
                        {
                            if (resultado.Columns.Count == 0) EstruturaComboSemana(ref resultado);

                            semana = (list.semana == null) ? 0 : int.Parse(list.semana.Value.ToString());

                            List<Calendario> listCalendario = new List<Calendario>();
                            listCalendario = BuscarDiasSemana(ano, semana);

                            registro = resultado.NewRow();
                            registro["DataCompleta"] = listCalendario[0].DataCompleta.ToString("dd/MM/yyyy");
                            registro["Semana"] = listCalendario[0].Semana.ToString() + "ª - " + listCalendario[0].DataCompleta.ToString("dd/MM/yyyy") + " a " + listCalendario[listCalendario.Count - 1].DataCompleta.ToString("dd/MM/yyyy");

                            resultado.Rows.Add(registro);
                        }
                    }
                }

                return resultado;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #endregion
    }
}
